package com.atguigu.gmall.all.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import com.atguigu.gmall.model.list.SearchResponseVo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;

import javax.annotation.Resource;
import java.util.*;

/**
 * @author tongatong
 * @name ListController
 * @description
 * @date 2021/9/21
 * @time 23:32
 */
@Controller
public class ListController {
    @Resource
    private ListFeignClient listFeignClient;

    /**
     * 列表搜索
     * @param searchParam 前台获取的检索信息
     * @return 页面路径
     */
    @GetMapping("list.html")
    public String search(SearchParam searchParam, Model model) {
        Result<SearchResponseVo> result = listFeignClient.list(searchParam);
        Map<String, Object> resultMap = JSONObject.parseObject(JSONObject.toJSONString(result.getData()), Map.class);
        model.addAllAttributes(resultMap);

        //拼接的url
        String urlParam = makeUrlParam(searchParam);
        //处理品牌条件回显
        String trademarkParam = this.makeTrademark(searchParam.getTrademark());
        //处理平台属性条件回显
        List<Map<String, String>> propsParamList = this.makeProps(searchParam.getProps());
        //处理排序
        Map<String,Object> orderMap = this.dealOrder(searchParam.getOrder());

        model.addAttribute("urlParam",urlParam);
        model.addAttribute("searchParam", searchParam);
        model.addAttribute("trademarkParam",trademarkParam);
        model.addAttribute("propsParamList",propsParamList);
        model.addAttribute("orderMap",orderMap);

        return "list/index";
    }

    /**
     * 面包屑处理，处理平台属性
     * 获取到的数据格式：平台属性Id：平台属性值名称：平台属性名
     * @param props 前台传递的属性数组
     * @return map类型的list数组
     */
    private List<Map<String, String>> makeProps(String[] props) {
        List<Map<String, String>> list = new ArrayList<>();
        //数据格式：平台属性Id：平台属性值名称：平台属性名,例如：2:v:n
        if (props!=null && props.length!=0){
            for (String prop : props) {
                //这里使用StringUtils.split()，是不对的，因为他只能分隔两段
//                String[] split = StringUtils.split(trademark, ":");
                //使用split()，不用判断是否为空，因为就算没有分割点，他会返回要分隔的字符串
                String[] split = prop.split(":");
                if (split.length==3){
                    // 声明一个map
                    HashMap<String, String> map = new HashMap<>();
                    map.put("attrId",split[0]);
                    map.put("attrValue",split[1]);
                    map.put("attrName",split[2]);
                    list.add(map);
                }
            }
        }
        return list;

    }

    /**
     * 面包屑处理，处理品牌信息
     * 获取到的品牌信息格式： 2:华为
     * @param trademark 获取到品牌
     * @return 返回格式： 品牌：品牌名
     */
    private String makeTrademark(String trademark) {
        if (!StringUtils.isEmpty(trademark)) {
            String[] split = StringUtils.split(trademark, ":");
            if (split != null && split.length == 2) {
                return "品牌：" + split[1];
            }
        }
        return "";

    }

    /**
     * 拼接URL
     * @param searchParam 前台传递的检索信息
     * @return 拼接后的URL
     */
    private String makeUrlParam(SearchParam searchParam) {
        //用于拼接字符串
        StringBuilder urlParam = new StringBuilder();

        //哪种方式检索？ keyword不为空,关键词检索;为空分类列表检索
        String keyword = searchParam.getKeyword();
        //category1Id不为空，一级分类列表检索
        Long category1Id = searchParam.getCategory1Id();
        //category2Id不为空，二级分类列表检索
        Long category2Id = searchParam.getCategory2Id();
        //category3Id不为空，三级分类列表检索
        Long category3Id = searchParam.getCategory3Id();
        //品牌
        String trademark = searchParam.getTrademark();
        //平台属性值
        String[] props = searchParam.getProps();

        //关键词检索
        if (!StringUtils.isEmpty(keyword))
            urlParam.append("keyword=").append(keyword);
        //分类列表1检索
        else if(null != category1Id)
            urlParam.append("category1Id=").append(searchParam.getCategory1Id());
        //分类列表2检索
        else if(null != category2Id)
            urlParam.append("category2Id=").append(searchParam.getCategory2Id());
        //分类列表3检索
        else if(null != category3Id)
            urlParam.append("category3Id=").append(searchParam.getCategory3Id());

        //品牌属性
        if (!StringUtils.isEmpty(trademark))
            //是否通过两种检索方式过来的
            if (urlParam.length() > 0)
                urlParam.append("&trademark=").append(searchParam.getTrademark());

        //平台属性值处理
        if (null != props) {
            for (String prop : props) {
                if (urlParam.length() > 0){
                    urlParam.append("&props=").append(prop);
                }
            }
        }

        return "list.html?" + urlParam.toString();
    }

    /**
     * 排序
     * 数据格式：1:hotScore 2:price
     * @param order 排序数据
     * @return 处理后的排序数据
     */
    private Map<String, Object> dealOrder(String order) {
        Map<String,Object> orderMap = new HashMap<>();
        if(!StringUtils.isEmpty(order)) {
            //1:hotScore 2:price
            String[] split = StringUtils.split(order, ":");
            if (split != null && split.length == 2) {
                // 传递的哪个字段
                orderMap.put("type", split[0]);
                // 升序降序
                orderMap.put("sort", split[1]);
            }
        }else {
            //默认的排序方式
            orderMap.put("type", "1");
            orderMap.put("sort", "asc");
        }
        return orderMap;
    }

}
